2 Nginx 进阶


2.1 Nginx 快速入门

学习目标:
应用 nginx 环境部署
记住 nginx 配置结构及其访问原理
应用 server 配置段常见配置项
应用 location 配置格式
了解 location 配置规则的优先级

2.1.1 Nginx 简介

Nginx( 发音同 engine x) 是一款基于 异步框架 的轻量级 / 高性能的 Web   服务器 / 反向代理 服务器 / 缓存 服务器 / 电子邮件 (IMAP/POP3) 代理服务器,并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev( 伊戈尔·赛索耶夫 ) 所开发,最初供俄国大型网站 Rambler.ru 及搜寻引擎 Rambler 使用。
Nginx 特点
优点:
高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
内存消耗少:善于处理静态文件,相较于其他 web( 比如: apache), 占用更少的内存及资源
简单稳定:配置简单 ( 一个 conf 文件 ), 运行简单 (nginx 命令 ) ,而且运行稳定
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
支持 Rwrite 重写规则:能够根据域名、 URL 等请求关键点,实现定制化的高质量分发。
低成本: Nginx 的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。  
支持多系统: Nginx 代码完全用 C 语言从头写成,可以在各系统上编译并使用。
缺点:
动态处理差: nginx 善于处理静态文件,但是处理动态页面相较于 Apache 之类重量级的 web 软件能力稍欠缺。
rewrite 弱:虽然 nginx 支持 rewrite 功能多,但是相较于 Apache 之类重量级的 web 软件能力稍欠缺。

2.1.2 Nginx 部署

Nginx 软件部署
安装 Nginx 软件
方法一:快
apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y

方法二:定制标准高
编译安装,请关注后续 "shell 自动化运维 " 课程
检查效果:
netstat -tnulp | grep nginx
浏览器查看

服务相关命令
systemctl start|stop|reload|... nginx
/etc/init.d/nginx start|stop|reload|...
/usr/sbin/nginx ...
nginx -V

nginx 服务相关命令
nginx -V
nginx -v
nginx -s stop
nginx -s reload
nginx -t    检查默认配置文件
nginx -t -c file.conf    指定配置文件进行检查

移除相关命令:
# 查看和nginx相关软件
dpkg --get-selections|grep nginx
# 移除nginx,包括相关文件
apt-get --purge remove nginx
apt-get --purge remove nginx-common
apt-get --purge remove nginx-core

Nginx配置简介
nginx软件目录:
工作目录:/etc/nginx
执行文件: /usr/sbin/nginx
日志目录:/var/log/nginx
启动文件:/etc/init.d/nginx
web目录:/var/www/html/,首页文件是index.nginx-debian.html
/usr/share/nginx/html/ 首页文件是index.html

nginx配置文件:
默认文件:
/etc/nginx/nginx.conf
其他目录:
/etc/nginx/{sites-available/sites-enabled/conf.d}
文件结构:
全局配置段
http配置段
server配置段    项目或者应用
location配置段    url配置

Nginx 访问原理

2.1.3 配置详解

全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:

user     设置使用用户(worker)
worker_processes     进行增大并发连接数的处理 跟cpu保持一致 八核设置八个
error_log     nginx的错误日志
pid      nginx服务启动时候pid
events    定义事件相关的属性
worker_connections     一个进程允许处理的最大连接数
use     定义使用的内核模型

http 配置段
主要配置 server 通用的一些配置
include mime.types;     # 文件扩展名与文件类型映射表
default_type application/octet-stream;     # 默认文件类型
sendfile on;     # 开启高效文件传输模式。
autoindex on;     # 开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on;     # 防止网络阻塞
tcp_nodelay on;     # 防止网络阻塞
keepalive_timeout 120;     # 长连接超时时间,单位是秒
gzip on;     # 开启gzip压缩输出

Server 常见配置属性
常见样式
server {
    listen 端口;
    server_name 主机名;
    ...
}

server 配置段最重要的属性是 listen server_name 。它们都是用于匹配并处理请求的。
listen 属性
作用:定义 Server 监听的 ip port ,当 ip/port 匹配时候才进行下一步匹配
表现形式:

形式
描述
示例
完整示例
IP:Port
地址精确表示样式
listen 10.10.10.10:99
listen 10.10.10.10:99
IP
自动监听 IP:80 地址
listen 10.10.10.10
listen 10.10.10.10:80
Port
自动监听 全地址 :Port
listen 99 [::]:99
listen 0.0.0.0:99
default_server
自动使用默认的地址
listen default_server
listen localhost:80
使用原则:
首先将所有样式补全成 IP:Port, 然后匹配 , 匹配 Server 多,那么接着使用 Server_name 匹配
server_name 属性
作用:定义 Server 监听的域名,当域名匹配时候才进行下一步操作
表现形式:

格式
完整样式
前缀正则样式
后缀正则样式
禁止非法域名或 IP
形式
_
使用原则:
优先使用完整样式 , 然后使用前缀正则样式 , 最后使用后缀正则样式 , 如果正则样式相同的时候 , 匹配最长 , 否则就走非法规则。
非法域名 /IP ,表示请求到该主机上一个不存在的 IP 或者域名
root 属性
作用:定义 Server 相应请求的 html 文件所在路径
表现形式: root /var/www/html;
index 属性
作用:定义响应请求后返回的文件名称或格式
表现形式:
index index.html index.htm index.nginx-debian.html;
return 属性
作用:定义响应请求后返回的 http 状态码
表现形式:
return       444;
location 常见配置属性
location 主要是根据 Server 匹配到的请求路径和关键字去响应和处理。
语法:
location optional_modifier location_match { ... }
location @name { ... }

其中: optional_modifier 是匹配条件, location_match 是匹配的样式, {} 是要执行的操作。匹配条件主要有两种 : 正则 / 前缀字符。
匹配规则
正则匹配

类型
含义
匹配方式
优先级
样式
~|!~
普通正则 - 敏感 | 不敏感
正则符号
3
location ~ .(jpe?g)$ {}
~*|!~*
普通正则 - 不敏感 | 敏感
正则符号
3
location ~* .(jpe?g)$ {}
普通匹配

类型
含义
匹配方式
优先级
样式
=/路径
精确匹配
前缀
1
location = /image {}
^~
优先匹配
前缀
2
location ^~ /page {}
@
内部重定向
前缀
3
location @name {}
空 /
通用匹配
前缀
4
location / {}

使用原则:
前提:根据请求 url ,获取 uri 即除了域名 /IP 之外的部分,用于 location 匹配
如果有精确匹配,即 =/ 路径,找到匹配项后,结束匹配。
location = 路径 {}   或者   location 完整路径 {}
如果有优先匹配,即 ^~ ,找到匹配项后,结束匹配。
location ^~ 路径
如果有正则匹配,即 ~|!~|~*|!~* ,找到匹配项后,不会终止继续匹配,直到找到合适的
location ~* 正则字符 {}
如果匹配到多个,则使用 location_match 最长的。
匹配示例
常见示例:

location = / {                 location ~ \.(gif|jpg|png|js|css)$ {      location !~* \.xhtml$ {
   #精确规则A                         #正则规则D                                    #正则规则G
}                              }                                         }
location = /login {            location ~* \.png$ {                      location / {
   #精确规则B                         #正则规则E                                    #通用规则H
}                              }                                         }
location ^~ /static/ {         location !~ \.xhtml$ {
   #优先规则C                         #正则规则F
}                              }

访问效果如下:

访问根目录/, 比如http://a.com/ 将匹配规则A
访问 http://a.com/login 将匹配规则B
访问 http://a.com/static/a.html 将匹配规则C
访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png 则优先匹配到规则C
访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。
访问 http://a.com/a.XHTML 使用规则F。
访问 http://a.com/category/id/1111 则最终匹配到规则H。
@name 示例
@用来定义一个命名location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:
location / {
    try_files $uri $uri/ @custom
}
location @custom {
    # ...do something
    # custom 命名的 location中不能再嵌套其它的命名location
}

关于 URL 尾部的 / 有如下注意事项:
1 location 中的 location_match 字符有无 "/" 不受影响。 /user/ 等同 /user
2 对于访问网站域名 ( http://sswang.com/ ) ,尾部有无 "/" 不受影响。因为浏览器会自动补全 "/"
3 对于访问网站域名后面的路径 ( http://sswang.com/other/ ) 。尾部的 "/" 很重要。
URL 尾部的 "/" 表示目录,没有 "/" 表示文件,而且文件找不到的话,会发生重定向。
/other/ :表示服务器会自动去该目录下找对应的默认文件。
/other :表示服务器会先去找 other 文件,找不到的话会将 other 当成目录,重定向到 /other/ ,去该目录下找默认文件。
location 常见动作:
location 内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。
基本属性

基本属性
location / {
        root   /var/www/html;    # 指定响应请求的文件所在路径
        index  index.php index.html index.htm;    # 指定响应请求的默认文件名称
        expires 7d;    # 指定响应请求的文件过期时间,一般用于静态文件
        try_files $uri $uri/ =404;    # 如果root指定的路径下有查找的文件,就返回,否则报错
}
临时跳转
location = /test/ {
    return 302 http://sswang.com/;    # 访问旧url的时候,临时跳转到新url,两个url均不失效
}
访问控制
location /nginx-status {
    stub_status on;      # 开启nginx的状态页面,默认关闭
    allow 192.168.8.14;    # 允许的访问地址
    deny all;    # 默认进制所有访问
}
注意:
    该功能依赖于ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)
目录列表
location /upload {
    alias   /var/www/upload;    # 指定查看文件列表路径(绝对路径)
    autoindex on;                 # 开启目录自动索引
    autoindex_exact_size off;     # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)
    autoindex_localtime on;       # 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间
}
注意:
    该alias指定的目录下,不允许出现index属性指定的文件。

root VS alias
root alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别
  root 表示 location 匹配内容的相对路径
  alias 表示 一个绝对路径 , 而且必须以 "/" 结尾
一般情况下,在 location / 中配置 root ,在 location /other 中配置 alias

效果一:    效果二:
location /img/ {                           location /img/ {
alias /var/www/image/;                    root /var/www/image;
}     

效果一:访问http://localhost/img/,nginx找/var/www/image/目录下的文件
效果二:访问http://localhost/img/,nginx找/var/www/image/img/目录下的文件

location 核心动作
Nginx 的配置语法灵活,可控制度非常高。在 0.7 以后的版本中加入了一个 try_files 指令,配合命名 location ,可以部分替代原本常用的 rewrite 配置方式,提高解析效率。
指令语法
try_files file ... uri
try_files file ... =code

作用:
响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。

常见示例
如果能找到指定的uri那么就返回相应的内容,否则的话返回错误状态码404
    try_files $uri $uri/ =404;
如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容
    try_files 1.html 2.html /6.html;
如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的location
    try_files $uri @backup;
注意:
如果最后一个地址是一个uri的话,那么这个uri必须是存在的,否则的话就出事了